home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / GMSMTH01.ZIP / LOGIC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-08  |  10.1 KB  |  396 lines

  1. /*
  2.  
  3.     logic.c
  4.  
  5.     Internet: alexad3@icebox.iceonline.com
  6.     Copyright 1994, September 26 by Alec Russell, ALL rights reserved
  7.  
  8.     Created - 1994/9/26
  9.    Part of the 3D ball demo
  10.  
  11.     History:
  12.         New file
  13.  
  14. */
  15.  
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <conio.h>
  20. #include <alloc.h>
  21. #include <dos.h>
  22. #include <time.h>
  23.  
  24. #include <pr2.h>
  25. #include <palette.h>
  26. #include <readlbm.h>
  27. #include <fstring.h>
  28. #include <g_io.h>
  29. #include <gui.h>
  30. #include <erase.h>
  31. #include <die.h>
  32. #include <gmalloc.h>
  33.  
  34. #include <Xlib_all.h>
  35. #include "tank.h"
  36.  
  37. // POLY stuff
  38. /* Contains flags indicating pending ball moves */
  39. short BallEvent = FLIP_SPIN_AXIS;
  40.  
  41. play_logic_t pl;
  42.  
  43. /* ---------------------- init_play_logic() ---------- September 26,1994 */
  44. void init_play_logic(void)
  45. {
  46.    pl.ViewAngle=0;
  47.    pl.PolySpeed=30;
  48.    pl.hd=0;
  49.    pl.rot_state=0;
  50.    pl.accn_state=0;
  51.    pl.done=0;
  52.  
  53. }
  54.  
  55. #if 0
  56. // this code was for rocks/bushes moving by on the ground
  57. // an experiment
  58.  
  59. /* ---------------------- project_grdobjs() ------------ September 27,1994 */
  60. void project_grdobjs(void)
  61. {
  62.    short i;
  63.    xscale_t far *xb;
  64.    Fixedpoint cos, sin, x, z, x0;
  65.    Xform XformToView;
  66.    Point3 XformedPoints;
  67.  
  68.    memset(&XformToView, 0, sizeof(Xform));
  69.    CosSin((TAngle)pl.ViewAngle, &cos, &sin);
  70.    for ( i=0, xb=play_data.grdobjs; i < NUM_GRDOBJS; i++, xb++ )
  71.       {
  72.       // this is a 2d hack that assumes that Y is 0 ----
  73.       x=xb->point.X - WorldCentre.X;  // WorldCentre is where the players tank is at
  74.       z=xb->point.Z - WorldCentre.Z;
  75.       x0=FixedMul(x, cos) - FixedMul(z, sin);
  76.       z= FixedMul(z, cos) + FixedMul(x, sin);
  77.       if ( z > MIN_Z || z < MAX_GZ )
  78.          {
  79.          xb->draw=0;  // its behind us
  80.  
  81.          // move to infront of us in distance
  82.          if ( pl.PolySpeed <= 0 )
  83.             {
  84.             z=-(random(700) + 300);
  85.             x0=random(1000) - 500;
  86.             x0=INT_TO_FIXED(x0);
  87.             xb->point.Z=WorldCentre.Z+FixedMul(INT_TO_FIXED(z), cos);
  88.             xb->point.X=WorldCentre.X+FixedMul(x0, sin);
  89.             xb->point.X+=INT_TO_FIXED(random(100) - 50);
  90.             }
  91.          else
  92.             {
  93.             z=MIN_Z - INT_TO_FIXED(random(10)) - INT_TO_FIXED(5);
  94.             x0=random(1000) - 500;
  95.             xb->point.Z=WorldCentre.Z+FixedMul(z, cos);
  96.             xb->point.X=WorldCentre.X+FixedMul(INT_TO_FIXED(x0), sin);
  97.             }
  98.          }
  99.       else
  100.          {
  101.          XformToView[0][3]=x0;
  102.          XformToView[2][3]=z;
  103.          xb->draw=1;
  104.          XformVec(&XformToView, (Fixedpoint *)&xb->point,
  105.                (Fixedpoint *)&XformedPoints);
  106.          xb->vz=XformToView[2][3];
  107.          xb->vx=XformToView[0][3];
  108.          x=FixedMul(FixedDiv(XformedPoints.X, XformedPoints.Z), PolyScreenWidth);
  109.          xb->sx=((int) ((x + 32768l) >> 16)) + PolyCentreX;
  110.  
  111.          // calc size of bitmap
  112.          x=FixedMul(FixedDiv(INT_TO_FIXED(xb->width), XformedPoints.Z), PolyScreenWidth);
  113.          xb->nw=((int) ((x + 32768l) >> 16));
  114.          x=FixedMul(FixedDiv(INT_TO_FIXED(xb->height), XformedPoints.Z), PolyScreenWidth);
  115.          xb->nh=((int) ((x + 32768l) >> 16));
  116.  
  117.  
  118.          xb->sy=PolyCentreY;
  119.          xb->sx-=xb->nw>>1;
  120.          xb->sy+=xb->nh;
  121.          }
  122.       }
  123. }
  124. #endif
  125.  
  126. /* ---------------------- project_xobjs() ------------ September 27,1994 */
  127. void project_xobjs(void)
  128. {
  129.    short i;
  130.    xscale_t far *xb;
  131.    Fixedpoint cos, sin, x, z, x0;
  132.    Xform XformToView;
  133.    Point3 XformedPoints;
  134.  
  135.    memset(&XformToView, 0, sizeof(Xform));
  136.    CosSin((TAngle)pl.ViewAngle, &cos, &sin);
  137.    for ( i=0, xb=play_data.xobjs; i < NUM_XOBJS; i++, xb++ )
  138.       {
  139.       // this is a 2d hack that assumes that Y is 0 ----
  140.       x=xb->point.X - WorldCentre.X;  // WorldCentre is where the players tank is at
  141.       z=xb->point.Z - WorldCentre.Z;
  142.       x0=FixedMul(x, cos) - FixedMul(z, sin);
  143.       z= FixedMul(z, cos) + FixedMul(x, sin);
  144.       if ( z > MIN_Z )
  145.          {
  146.          xb->draw=0;  // its behind us
  147.          }
  148.       else
  149.          {
  150.          XformToView[0][3]=x0;
  151.          XformToView[2][3]=z;
  152.          xb->draw=1;
  153.          XformVec(&XformToView, (Fixedpoint *)&xb->point,
  154.                (Fixedpoint *)&XformedPoints);
  155.          xb->vz=XformToView[2][3];
  156.          xb->vx=XformToView[0][3];
  157.          x=FixedMul(FixedDiv(XformedPoints.X, XformedPoints.Z), PolyScreenWidth);
  158.          xb->sx=((int) ((x + 32768l) >> 16)) + PolyCentreX;
  159.  
  160.          // calc size of bitmap
  161.          x=FixedMul(FixedDiv(INT_TO_FIXED(xb->width), XformedPoints.Z), PolyScreenWidth);
  162.          xb->nw=((int) ((x + 32768l) >> 16));
  163.          x=FixedMul(FixedDiv(INT_TO_FIXED(xb->height), XformedPoints.Z), PolyScreenWidth);
  164.          xb->nh=((int) ((x + 32768l) >> 16));
  165.  
  166.  
  167.          xb->sy=PolyCentreY;
  168.          xb->sx-=xb->nw>>1;
  169.          xb->sy-=xb->nh>>1;
  170.          }
  171.       }
  172. }
  173.  
  174.  
  175.  
  176. /* ---------------------- do_play_logic() ------------ September 26,1994 */
  177. void do_play_logic(void)
  178. {
  179.    event_t event;
  180.    Fixedpoint sin, cos;
  181.    Object *ObjectPtr;
  182.    short i;
  183.  
  184.    /* For each object, regenerate viewing info, if necessary */
  185.    ViewAngle=pl.ViewAngle;
  186.    for (i=0, ObjectPtr = ObjectListStart.NextObject; i < NumObjects;
  187.          i++, ObjectPtr = ObjectPtr->NextObject)
  188.       {
  189.       if (ObjectPtr->RecalcXform || RecalcAllXforms)
  190.          {
  191.          XformAndProjectPObject(ObjectPtr);
  192.          ObjectPtr->RecalcXform = 0;
  193.          }
  194.       }
  195.    RecalcAllXforms = 0;
  196.  
  197.  
  198.    if ( get_event(&event) )
  199.       {
  200.       switch ( event.type )
  201.          {
  202.          case E_B0_DN:
  203.             pl.PolySpeed=0;
  204.             break;
  205.  
  206.          case E_JOY_X_LEFT:
  207.             pl.rot_state=5;
  208.             break;
  209.  
  210.          case E_JOY_X_CENTRE:
  211.             pl.rot_state=0;
  212.             break;
  213.  
  214.          case E_JOY_X_RIGHT:
  215.             pl.rot_state=-5;
  216.             break;
  217.  
  218.          case E_JOY_Y_UP:
  219.             pl.accn_state=-1;
  220.             break;
  221.  
  222.          case E_JOY_Y_CENTRE:
  223.             pl.accn_state=0;
  224.             break;
  225.  
  226.          case E_JOY_Y_DOWN:
  227.             pl.accn_state=1;
  228.             break;
  229.  
  230.          case E_KEY:
  231.             if ( event.sub_type == E_UP )
  232.                {
  233.                switch ( event.d2 )
  234.                   {
  235.                   case ESC:
  236.                      pl.done=1;
  237.                      break;
  238.  
  239.  
  240.                   case CR:
  241.                      pl.PolySpeed=0;
  242.                      break;
  243.  
  244.                   case UP:
  245.                      if ( pl.accn_state < 0 )
  246.                         pl.accn_state=0;
  247.                      break;
  248.                   case DOWN:
  249.                      if ( pl.accn_state > 0 )
  250.                         pl.accn_state=0;
  251.                      break;
  252.  
  253.                   case LEFT:
  254.                      if ( pl.rot_state > 0 )
  255.                         pl.rot_state=0;
  256.                      break;
  257.                   case RIGHT:
  258.                      if ( pl.rot_state < 0 )
  259.                         pl.rot_state=0;
  260.                      break;
  261.  
  262.                   case 'i':
  263.                      pr2("X %d y %d",
  264.                           FIXED_TO_INT(WorldCentre.X),
  265.                           FIXED_TO_INT(WorldCentre.Z));
  266.                      break;
  267.  
  268.                   }
  269.                }
  270.             else
  271.                {
  272.                switch ( event.d2 )
  273.                   {
  274.                   case UP:
  275.                      pl.accn_state=-1;
  276.                      break;
  277.                   case DOWN:
  278.                      pl.accn_state=1;
  279.                      break;
  280.  
  281.                   case LEFT:
  282.                      pl.rot_state=5;
  283.                      break;
  284.                   case RIGHT:
  285.                      pl.rot_state=-5;
  286.                      break;
  287.  
  288.                   case SPACE:
  289.                      BallEvent |= FLIP_SPIN_AXIS;
  290.                      break;
  291.  
  292.                   /*
  293.                   case (UP | KM_CTRL_PLUS):
  294.                      BallEvent |= MOVE_UP;
  295.                      break;
  296.  
  297.                   case (DOWN | KM_CTRL_PLUS):
  298.                      BallEvent |= MOVE_DOWN;
  299.                      break;
  300.  
  301.                   case UP:
  302.                      BallEvent |= MOVE_TOWARD;
  303.                      break;
  304.  
  305.                   case DOWN:
  306.                      BallEvent |= MOVE_AWAY;
  307.                      break;
  308.  
  309.                   case LEFT:
  310.                      BallEvent |= MOVE_LEFT;
  311.                      break;
  312.  
  313.                   case RIGHT:
  314.                      BallEvent |= MOVE_RIGHT;
  315.                      break;
  316.                   */
  317.                   }
  318.                }
  319.             break;
  320.  
  321.          }
  322.       }
  323.  
  324.    if ( pl.rot_state )
  325.       {
  326.       if ( pl.rot_state > 0 )
  327.          {
  328.          pl.hd-=3;
  329.          if ( pl.hd < 0 )
  330.             pl.hd=1020;
  331.          }
  332.       else
  333.          {
  334.          pl.hd+=3;
  335.          if ( pl.hd > 1020 )
  336.             pl.hd=0;
  337.          }
  338.  
  339.       pl.ViewAngle+=pl.rot_state;
  340.       if ( pl.ViewAngle > 3600 )
  341.          {
  342.          pl.ViewAngle=0;
  343.          }
  344.       else
  345.          {
  346.          if ( pl.ViewAngle < 0 )
  347.             pl.ViewAngle=3600;
  348.          }
  349.       }
  350.    if ( pl.accn_state )
  351.       {
  352.       pl.PolySpeed+=pl.accn_state;
  353.       if ( pl.PolySpeed < -30 )
  354.          pl.PolySpeed=-10;
  355.       else
  356.          {
  357.          if ( pl.PolySpeed > 30 )
  358.             pl.PolySpeed=10;
  359.          }
  360.       }
  361.    else
  362.       {
  363.       if ( pl.PolySpeed > 0 )
  364.          pl.PolySpeed--;
  365.       else
  366.          {
  367.          if ( pl.PolySpeed < 0 )
  368.             pl.PolySpeed++;
  369.          }
  370.       }
  371.  
  372.    if ( pl.PolySpeed )
  373.       {
  374.       CosSin((TAngle)pl.ViewAngle, &cos, &sin);
  375.       WorldCentre.Z+=FixedMul(INT_TO_FIXED(pl.PolySpeed), cos);
  376.       WorldCentre.X+=FixedMul(INT_TO_FIXED(pl.PolySpeed), sin);
  377.       }
  378.  
  379.    // calc position of xobjs
  380.    project_xobjs();
  381.  
  382.    /* Move and reorient each POLYGON object */
  383.    for (i=0, ObjectPtr = ObjectListStart.NextObject; i<NumObjects;
  384.          i++, ObjectPtr = ObjectPtr->NextObject)
  385.       {
  386.       ViewAngle=pl.ViewAngle;
  387.       RotateAndMoveBall(ObjectPtr);
  388.       }
  389.    BallEvent=0;
  390.  
  391. }
  392.  
  393.  
  394. /* ------------------------------ EOF -------------------------------- */
  395.  
  396.